﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Librerias;
using System.Collections;

//Autor: Arturo Serna

namespace eCampus
{
    /// <summary>
    /// Clase que muestra una conversación.
    /// Entendiendo conversación como la interacción de mensajes entre 1 o 2 autores con el mismo asunto
    /// </summary>
    public partial class LineaMensaje : Form
    {
        ENMensaje en;

        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="datos">Datos del asunto, emisor y recetor necesarios para obtener la conversación</param>
        public LineaMensaje(ENMensaje datos)
        {
            en = datos; 
            InitializeComponent();

            ActualizaConversacion(true);

            tbAsunto.Text = en.Asunto;
        }

        /// <summary>
        /// Pinta la tabla
        /// </summary>
        /// <param name="primeraVez">false</param>
        private void ActualizaConversacion(bool primeraVez=false)
        {
            try
            {
                datagrid.DataSource = en.GetConversacionByAsunto();

                if (primeraVez)
                {
                    datagrid.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;

                    datagrid.Columns["menId"].Visible = false;
                    datagrid.Columns["menEmisor"].Visible = false;
                    datagrid.Columns["menReceptor"].Visible = false;
                    datagrid.Columns["menPropietario"].Visible = false;
                    datagrid.Columns["menAsunto"].Visible = false;
                    datagrid.Columns["menArchivo"].Visible = false;
                    datagrid.Columns["menPuntuacion"].Visible = false;
                    datagrid.Columns["menLeido"].Visible = false;


                    datagrid.Columns["menMensaje"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

                    datagrid.Columns["menDate"].DefaultCellStyle.WrapMode = DataGridViewTriState.True;
                    datagrid.Columns["menMensaje"].DefaultCellStyle.WrapMode = DataGridViewTriState.True;


                    //Añade columna tipo
                    DataGridViewImageColumn ColTipo = new DataGridViewImageColumn();
                    ColTipo.Name = "adjunto";
                    ColTipo.HeaderText = "";
                    ColTipo.Image = eCampus.Properties.Resources.btDescargasMini;
                    ColTipo.Width = 25;
                    datagrid.Columns.Add(ColTipo);

                    //Añade columna eliminar
                    DataGridViewImageColumn ColEliminar = new DataGridViewImageColumn();
                    ColEliminar.Name = "elim";
                    ColEliminar.HeaderText = "";
                    ColEliminar.Image = eCampus.Properties.Resources.btBorrar;
                    ColEliminar.Width = 25;
                    datagrid.Columns.Add(ColEliminar);
                }
                //Hace scroll-down hasta el final de la tabla
                datagrid.FirstDisplayedScrollingRowIndex = datagrid.RowCount - 1;
            }
            catch (Exception)
            {
                MessageBox.Show("Error al cargar la tabla", "Error");
            }
        }

        /// <summary>
        /// Envia un mensaje
        /// </summary>
        /// <param name="sender">btEnvia</param>
        /// <param name="e">Click</param>
        private void btEnviar_Click(object sender, EventArgs e)
        {
            try
            {
                if (tbArchivo.Text != "") progressBar1.Visible = true;

                (new ENMensaje(en.Receptor, en.Emisor, en.Asunto, tbMensaje.Text, tbArchivo.Text)).Enviar(progressBar1);

                progressBar1.Visible = false;
                ActualizaConversacion();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
            }
        }

        /// <summary>
        /// Aplica formato a la tabla.
        /// Pinta a cada agente de un color, si hay adjunto muestra la imagen y da formato a la primera celda (autor+fecha)
        /// </summary>
        /// <param name="sender">datagrid</param>
        /// <param name="e">CellFormatting</param>
        private void datagrid_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {

            if (e.Value != null)
            {
                //Primera columna: muestra autor + fecha
                if (datagrid.Columns["menDate"].Index == e.ColumnIndex)
                {
                    e.Value = datagrid["menEmisor", e.RowIndex].Value + "\r\n" + e.Value;
                }
                //Si no hay archivo adjunto borra el icono de descargar
                else if (datagrid.Columns["adjunto"].Index == e.ColumnIndex
                         && datagrid["menArchivo", e.RowIndex].Value.ToString() == "")
                {
                    e.Value = eCampus.Properties.Resources.blanco;
                }
                //Si es el emisor, pinta la fila de azul
                if (datagrid["menEmisor", e.RowIndex].Value.ToString() != en.Emisor)
                {
                    e.CellStyle.BackColor = Color.Azure;
                }
            }
        }

        /// <summary>
        /// Elimina todos los mensajes de la conversacion
        /// </summary>
        /// <param name="sender">btEliminarTodo</param>
        /// <param name="e">Click</param>
        private void btEliminarTodo_Click(object sender, EventArgs e)
        {
            ArrayList res = new ArrayList();

            for (int i = 0; i < datagrid.Rows.Count; i++)
            {
                res.Add(int.Parse(datagrid["menId", i].Value.ToString()));
            }


            if (MessageBox.Show("¿Desea eliminar toda la conversación ("+ datagrid.Rows.Count+" mensajes)?", "Eliminar conversación", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
            {
                try
                {
                    en.Eliminar(res);
                    Close();
                }
                catch (Exception)
                {
                    MessageBox.Show("Error al eliminar", "Error");
                }

            }
        }

        /// <summary>
        /// Funciones al hacer click en una celda: Descargar y eliminar
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void datagrid_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0)
            {
                //Eliminar
                if (e.ColumnIndex == datagrid.Columns["elim"].Index)
                {
                    if (MessageBox.Show("¿Desea eliminar permanentemente \"" + datagrid["menAsunto", e.RowIndex].Value.ToString() + "\"?", "Eliminar mensaje", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
                    {
                        try
                        {
                            en.Eliminar(int.Parse(datagrid["menId", e.RowIndex].Value.ToString()));
                            ActualizaConversacion();
                        }
                        catch (Exception)
                        {
                            MessageBox.Show("Error al eliminar", "Error");
                        }
                    }
                }
                //Descargar
                else if (e.ColumnIndex == datagrid.Columns["adjunto"].Index
                        && datagrid["menArchivo",e.RowIndex].Value.ToString() != "")
                {
                    SaveFileDialog dialogoDescarga = new SaveFileDialog();
                    dialogoDescarga.Title = "Descargar";
                    dialogoDescarga.FileName = CADGestionDropbox.GetFicheroFromRuta(datagrid["menArchivo", e.RowIndex].Value.ToString().Replace('/', '\\'));
                    if (dialogoDescarga.ShowDialog() == DialogResult.OK)
                    {
                        if (en.Descargar(datagrid["menArchivo", e.RowIndex].Value.ToString(), dialogoDescarga.FileName.Substring(0, dialogoDescarga.FileName.LastIndexOf("\\")), progressBar1))
                        {
                            MessageBox.Show("El fichero se ha descargado correctamente", "Descarga finalizada");
                        }
                        else
                        {
                            MessageBox.Show("La descarga no se realizó correctamente", "Error en la descarga");
                        }
                    }
                }
            }
        }

        /// <summary>
        /// Abre el dialogo de descarga
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog dialogoSubir = new OpenFileDialog();
            if (dialogoSubir.ShowDialog() == DialogResult.OK)
            {
                tbArchivo.Text = dialogoSubir.FileName;
            }
        }

        /// <summary>
        /// Al cargar el formulario, hace scroll-down hasta el final del datagrid
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void LineaMensaje_Load(object sender, EventArgs e)
        {

            datagrid.FirstDisplayedScrollingRowIndex = datagrid.RowCount - 1;
        }

        private void datagrid_SelectionChanged(object sender, EventArgs e)
        {
            datagrid.ClearSelection();
        }

    }
}
